package com.github.junrar.unpack.ppm;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 * For debugging purposes only.
 * 
 * @author alban
 */
public class AnalyzeHeapDump {

	/** Creates a new instance of AnalyzeHeapDump */
	public AnalyzeHeapDump() {
	}

	public static void main(String[] argv) {
		File cfile = new File("P:\\test\\heapdumpc");
		File jfile = new File("P:\\test\\heapdumpj");
		if (!cfile.exists()) {
			System.err.println("File not found: " + cfile.getAbsolutePath());
			return;
		}
		if (!jfile.exists()) {
			System.err.println("File not found: " + jfile.getAbsolutePath());
			return;
		}
		long clen = cfile.length();
		long jlen = jfile.length();
		if (clen != jlen) {
			System.out.println("File size mismatch");
			System.out.println("clen = " + clen);
			System.out.println("jlen = " + jlen);
		}
		// Do byte comparison
		long len = Math.min(clen, jlen);
		InputStream cin = null;
		InputStream jin = null;
		int bufferLen = 256 * 1024;
		try {
			cin = new BufferedInputStream(new FileInputStream(cfile), bufferLen);
			jin = new BufferedInputStream(new FileInputStream(jfile), bufferLen);
			boolean matching = true;
			boolean mismatchFound = false;
			long startOff = 0L;
			long off = 0L;
			while (off < len) {
				if (cin.read() != jin.read()) {
					if (matching) {
						startOff = off;
						matching = false;
						mismatchFound = true;
					}
				} else { // match
					if (!matching) {
						printMismatch(startOff, off);
						matching = true;
					}
				}
				off++;
			}
			if (!matching) {
				printMismatch(startOff, off);
			}
			if (!mismatchFound) {
				System.out.println("Files are identical");
			}
			System.out.println("Done");
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				cin.close();
				jin.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

	private static void printMismatch(long startOff, long bytesRead) {
		System.out.println("Mismatch: off=" + startOff + "(0x"
				+ Long.toHexString(startOff) + "), len="
				+ (bytesRead - startOff));
	}
}
